/*
 - Autor(es):
 -      Rommel A. Quintanilla C.
 -      Donia A. Ruelas A.
 -      Julio C. Ccahuana M.
 - Fecha: 16/05/07

 - Copyleft: (C) 2007
 - Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los
 - terminos de la Licencia Publica General de GNU segun es publicada por la Free
 - Software Foundation, de la version 2 de dicha Licencia.
 -
 - Este programa se distribuye con la esperanza de que sea util, pero SI NINGUNA
 - GARANTIA; tampoco las implicitas garantias de MERCANTILIDAD o ADECUACION A UN
 - PROPOSITO PARTICULAR. Consulte la GNU General Public License (GPL) para mas
 - detalles adjuntada a este programa. (Fichero: JuradoWeb-License.txt).
 -
 - Descripcion:
 - BeanUsuarioDatos.
*/

package pe.edu.unap.jurado.BeansDatos;

import javax.xml.bind.*;
import java.io.*;
import java.sql.*;
import java.util.*;
import pe.edu.unap.jurado.BeansDatos.BeanConfiguracionDatos;
import pe.edu.unap.jurado.Beans.*;

public class BeanUsuarioDatos extends BeanDatos
{
  public BeanUsuarioDatos()
  throws SQLException
  {
    fichero = new String("BeanUsuarioDatos.java");  
  }

 public BeanUsuario getUsuario(String idUsuario)
 throws SQLException
 {
  BeanUsuario usuario = null;
   instruccion=conexion.prepareStatement("SELECT * FROM Usuario WHERE idUsuario = ?;");
   instruccion.setString(1,idUsuario);
   ResultSet resultado=instruccion.executeQuery();

   usuario=new BeanUsuario();
   resultado.next();
   usuario.setIdUsuario(resultado.getString(1));
   usuario.setIdLugarNacimiento(resultado.getString(2));
   usuario.setNombreCompleto(resultado.getString(3));
   usuario.setNickname(resultado.getString(4));
   usuario.setEmail(resultado.getString(5));
   usuario.setContrasenia(resultado.getString(6));
   usuario.setNumProblemasResueltos(resultado.getString(7));
   usuario.setNumProblemasIntentados(resultado.getString(8));
   usuario.setFechaRegistro(resultado.getString(9));
  return usuario;  
 }

 public String getIdUsuario(String nickname)
 throws SQLException
 {
  String idUsuario = null;
   instruccion=conexion.prepareStatement("SELECT * FROM Usuario WHERE nickname = ?;");
   instruccion.setString(1,nickname);
   ResultSet resultado=instruccion.executeQuery();

   resultado.next();
   idUsuario = resultado.getString(1);
  return idUsuario;  
 }
 
 public Boolean nickOcupado(String nickname)
 throws SQLException
 {
   instruccion=conexion.prepareStatement("SELECT * FROM Usuario WHERE nickname = ?;");
   instruccion.setString(1,nickname);
   ResultSet resultado=instruccion.executeQuery();
   if(resultado.next())
    return true;
  return false;  
 }

 public Boolean esUsuario(String nickname,String contrasenia)
 throws SQLException
 {
   instruccion=conexion.prepareStatement("SELECT * FROM Usuario WHERE nickname = ? AND contrasenia = MD5(?);");
   instruccion.setString(1,nickname);
   instruccion.setString(2,contrasenia);
   ResultSet resultado=instruccion.executeQuery();
   if(resultado.next())
    return true;
  return false;
 }

 public List getListaUsuario()
 throws SQLException
 {
  List lista=new ArrayList(); 
   instruccion=conexion.prepareStatement("SELECT * FROM Usuario;");
   ResultSet resultado=instruccion.executeQuery();
   while(resultado.next())
   { 
    BeanUsuario usuario=new BeanUsuario();
    usuario.setIdUsuario(resultado.getString(1));
    usuario.setIdLugarNacimiento(resultado.getString(2));
    usuario.setNombreCompleto(resultado.getString(3));
    usuario.setNickname(resultado.getString(4));
    usuario.setEmail(resultado.getString(5));
    usuario.setContrasenia(resultado.getString(6));
    usuario.setNumProblemasResueltos(resultado.getString(7));
    usuario.setNumProblemasIntentados(resultado.getString(8));
    usuario.setFechaRegistro(resultado.getString(9));
    lista.add(usuario);
   }
  return lista;
 }

 public List getListaRankingUsuario()
 throws SQLException
 {
  List lista=new ArrayList();
   instruccion=conexion.prepareStatement("SELECT * FROM Usuario ORDER BY numProblemasResueltos DESC,numProblemasIntentados DESC;");
   ResultSet resultado=instruccion.executeQuery();

   while(resultado.next())
   {
    BeanUsuario usuario=new BeanUsuario();
    usuario.setIdUsuario(resultado.getString(1));
    usuario.setIdLugarNacimiento(resultado.getString(2));
    usuario.setNombreCompleto(resultado.getString(3));
    usuario.setNickname(resultado.getString(4));
    usuario.setEmail(resultado.getString(5));
    usuario.setContrasenia(resultado.getString(6));
    usuario.setNumProblemasResueltos(resultado.getString(7));
    usuario.setNumProblemasIntentados(resultado.getString(8));
    usuario.setFechaRegistro(resultado.getString(9));
    lista.add(usuario);
   }
  return lista;  
 }

 public void registrarUsuario(BeanUsuario usuario)
 throws SQLException
 {
   instruccion=conexion.prepareStatement("INSERT INTO Usuario (nombreCompleto,idlugarNacimiento,nickname,email,contrasenia,fechaRegistro) VALUES(?,?,?,?,MD5(?),CURDATE());");
   instruccion.setString(1,usuario.getNombreCompleto());
   instruccion.setString(2,usuario.getIdLugarNacimiento());
   instruccion.setString(3,usuario.getNickname());
   instruccion.setString(4,usuario.getEmail());
   instruccion.setString(5,usuario.getContrasenia());
   instruccion.executeUpdate();  
 }

 public void sumarSolucionUsuario(BeanUsuario usuario)
 throws SQLException
 {
   instruccion=conexion.prepareStatement("SELECT numProblemasResueltos FROM Usuario WHERE idUsuario = ?;");
   instruccion.setString(1,usuario.getIdUsuario());
   ResultSet resultado=instruccion.executeQuery();
   resultado.next();
   String numProblemasResueltos = new String(resultado.getString(1));
   int i_numProblemasResueltos = Integer.parseInt(numProblemasResueltos.trim());
   i_numProblemasResueltos++;
   numProblemasResueltos = String.valueOf(i_numProblemasResueltos);

   instruccion=conexion.prepareStatement("UPDATE Usuario SET numProblemasResueltos= ?  WHERE idUsuario = ?;");
   instruccion.setString(1,numProblemasResueltos);
   instruccion.setString(2,usuario.getIdUsuario());
   instruccion.executeUpdate();
 }

 public void sumarIntentoUsuario(BeanUsuario usuario)
 throws SQLException
 {
   instruccion=conexion.prepareStatement("SELECT numProblemasIntentados FROM Usuario WHERE idUsuario =?;");
   instruccion.setString(1,usuario.getIdUsuario());
   ResultSet resultado=instruccion.executeQuery();

   resultado.next();
   String numProblemasIntentados = new String(resultado.getString(1));
   int i_numProblemasIntentados = Integer.parseInt(numProblemasIntentados.trim());
   i_numProblemasIntentados++;
   numProblemasIntentados = String.valueOf(i_numProblemasIntentados);

   instruccion=conexion.prepareStatement("UPDATE Usuario SET numProblemasIntentados = ? WHERE idUsuario = ?;");
   instruccion.setString(1, numProblemasIntentados);
   instruccion.setString(2, usuario.getIdUsuario());
   instruccion.executeUpdate();
 }

 public String getMediaNumProblemasResueltos()
 throws SQLException
 {
  String mediaNumProblemasResueltos = null;
   instruccion=conexion.prepareStatement("SELECT AVG(numProblemasResueltos) FROM Usuario;");
   ResultSet resultado = instruccion.executeQuery();
   resultado.next();
   mediaNumProblemasResueltos = new String(resultado.getString(1));
  return mediaNumProblemasResueltos;
 }

 public String getModaNumProblemasResueltos()
 throws SQLException
 {
  String modaNumProblemasResueltos = null;
   instruccion=conexion.prepareStatement("SELECT DISTINCT numProblemasResueltos, COUNT(numProblemasResueltos) FROM Usuario GROUP BY numProblemasResueltos ORDER BY COUNT(numProblemasResueltos) DESC;");
   ResultSet resultado = instruccion.executeQuery();
   resultado.next();
   modaNumProblemasResueltos = new String(resultado.getString(1));
  return modaNumProblemasResueltos;
 }

 public String getDevStdNumProblemasResueltos()
 throws SQLException
 {
  String devStdNumProblemasResueltos = null;
   instruccion=conexion.prepareStatement("SELECT STDDEV(numProblemasResueltos) FROM Usuario;");
   ResultSet resultado = instruccion.executeQuery();

   resultado.next();
   devStdNumProblemasResueltos = new String(resultado.getString(1));
  return devStdNumProblemasResueltos;  
 }
}
